gusucode.com > 《MATLAB图像与视频处理实用案例详解》代码 > 《MATLAB图像与视频处理实用案例详解》代码/第 12 章 基于块匹配的全景图像拼接/Fun_StitchRGB.m

    function [MStitch, im] = Fun_StitchRGB(im2, W_box, H_box, bdown, MStitch)

W_min = MStitch.W_min;
W_max = MStitch.W_max;
H_min = MStitch.H_min;
minval = MStitch.minval;
im1 = MStitch.imrgb1;
[Fheight, Fwidth] = size(im2); 
im = MStitch.imrgb1;
im2 = MStitch.imrgb2;
[Pheight, Pwidth, depth] = size(im);
sz2 = size(im2);
[Pheight2, Pwidth2, depth2] = size(im2); 
w = 0; 
hw = waitbar(0, '图像拼接进度:', 'Name', '图像拼接……');
if bdown
    x2 = 1;
    for x1 = Pwidth-W_box : Pwidth
        y2 = 1;
        for y1 = Pheight-H_box+1 : Pheight
            [x1, y1] = CheckRC(x1, y1, im1);
            [x2, y2] = CheckRC(x2, y2, im2);
            w = x2/W_box; 
            im(y1, x1, 1) = im1(y1, x1, 1)*(1.0-w) + im2(y2, x2, 1)*w;
            im(y1, x1, 2) = im1(y1, x1, 2)*(1.0-w) + im2(y2, x2, 2)*w;
            im(y1, x1, 3) = im1(y1, x1, 3)*(1.0-w) + im2(y2, x2, 3)*w;
            y2 = y2 + 1;
        end
        x2 = x2 + 1;
        rt = 0.5*(x1 - Pwidth + W_box)/W_box;
        waitbar(rt, hw, sprintf('图像拼接进度:%i%%', round(rt*100)));
    end
    rt0 = rt;
    for y1 = 1 : H_box
        for x3 = x2 : Pwidth2
            [x1, y1] = CheckRC(x1, y1, im1);
            [x3, y1] = CheckRC(x3, y1, im2);
            im(y1, Pwidth+x3-x2+1, :) = im2(y1, x3, :);
        end
        rt = rt0 + 0.5*(y1 - 1)/H_box;
        waitbar(rt, hw, sprintf('图像拼接进度:%i%%', round(rt*100)));
    end
else
    x2 = 1;
    for x1 = Pwidth-W_box : Pwidth
        y2 = 1;
        for y1 = Fheight-H_box+1 : Fheight
            [x1, y1] = CheckRC(x1, y1, im1);
            [x2, y2] = CheckRC(x2, y2, im2);
            w = x2/W_box; 
            im(y1, x1, 1) = im1(y1, x1, 1)*(1.0-w) + im2(y2, x2, 1)*w;
            im(y1, x1, 2) = im1(y1, x1, 2)*(1.0-w) + im2(y2, x2, 2)*w;
            im(y1, x1, 3) = im1(y1, x1, 3)*(1.0-w) + im2(y2, x2, 3)*w;
            y2 = y2 + 1;
        end
        x2 = x2 + 1;
        rt = 0.5*(x1 - Pwidth + W_box)/W_box;
        waitbar(rt, hw, sprintf('图像拼接进度:%i%%', round(rt*100)));
    end
    rt0 = rt;
    for y1 = Fheight-H_box+1 : Fheight
        for x3 = x2 : Fwidth
            [x1, y1] = CheckRC(x1, y1, im1);
            [x3, y1] = CheckRC(x3, y1, im2);
            im(y1, Pwidth+x3-x2+1, :) = im2(y1, x3, :);
        end
        rt = rt0 + 0.5*(y1 - 1)/H_box;
        waitbar(rt, hw, sprintf('图像拼接进度:%i%%', round(rt*100)));
    end
end
MStitch.imrgb1 = im; 
[Pheight, Pwidth, depth] = size(im);
MStitch.Pwidth = Pwidth; 
MStitch.Pheight = Pheight;
rt = 1;
waitbar(rt, hw, sprintf('图像拼接进度:%i%%', round(rt*100)));
delete(hw);